//
// Created by swe_dev on 25-3-23.
//

#ifndef HX711_DRIVER_HPP
#define HX711_DRIVER_HPP

class Hx711Driver {
public:
    Hx711Driver(GPIO_TypeDef* sck_gpio_bank, uint16_t sck_gpio_pin,
                GPIO_TypeDef* data_gpio_bank, uint16_t data_gpio_pin)
                : m_sck_gpio_bank(sck_gpio_bank), m_sck_gpio_pin(sck_gpio_pin),
                m_data_gpio_bank(data_gpio_bank), m_data_gpio_pin(data_gpio_pin) { }

    int32_t read_count(){
        int32_t count = 0U;
        uint8_t i;
        HAL_GPIO_WritePin(m_sck_gpio_bank, m_sck_gpio_pin, GPIO_PIN_RESET);
        while (HAL_GPIO_ReadPin(m_data_gpio_bank, m_data_gpio_pin)) {
            HAL_Delay(1);
        }
        for (i=0;i<24;i++){
            HAL_GPIO_WritePin(m_sck_gpio_bank, m_sck_gpio_pin, GPIO_PIN_SET);
            count = count << 1;
            HAL_GPIO_WritePin(m_sck_gpio_bank, m_sck_gpio_pin, GPIO_PIN_RESET);
            if(HAL_GPIO_ReadPin(m_data_gpio_bank, m_data_gpio_pin)) {
                count++;
            }
        }
        HAL_GPIO_WritePin(m_sck_gpio_bank, m_sck_gpio_pin, GPIO_PIN_RESET);
        return count;
    }

    int32_t get_offset(int32_t times) {
        int32_t sum = 0;
        for (int32_t i=0; i<times; ++i) {
            HAL_Delay(500);
            auto w2 = read_count();
            sum += w2;
        }
        return sum/times;
    }

    int32_t get_weight(int32_t offset) {
        auto raw_count = read_count();
        return (raw_count - offset) / 431;
    }

protected:
    GPIO_TypeDef* m_sck_gpio_bank{nullptr};
    uint16_t m_sck_gpio_pin{0};
    GPIO_TypeDef* m_data_gpio_bank{nullptr};
    uint16_t m_data_gpio_pin{0};
};

#endif //HX711_DRIVER_HPP
